"""
第5周作业：
 随机生成一个字符串：
1 字符串是由 数字和大小写字母组成
2 不含特殊符号
3 可以指定生成几位
请设计出对应的函数

给定一个只包含大小写字母，数字的字符串，对其进行排序，保证：
s = "Sorting1234"
1 所有的小写字母在大写字母前面
2 所有的字母在数字前面
3 所有的奇数在偶数前面
请设计出对应的函数
"""
import string
import random


class SolveStringUtils:
    """本工具包暂时提供两个方法，生成随机字符串，进行字符串的排序"""
    DIGITS = set(string.digits)
    LETTERS = set(string.ascii_letters)
    UPPER_LETTERS = set(string.ascii_uppercase)
    LOWER_LETTERS = set(string.ascii_lowercase)
    ODD_NUM = set("13579")
    EVEN_NUM = set("02468")

    @classmethod
    def gen_random_string(cls, length: int, *, my_string: str = string.ascii_letters + string.digits):
        """生成随机字符串
        :param: length: 要随机字符串的长度
        :param: my_string: 从哪些字符串中生成随机字符串"""
        # 有没有可能 会出现 若干个一样的字符呢？
        return ''.join(random.choices(my_string, k=length))

    @classmethod
    def sort_string(cls, chars: str, rules=lambda val: [1 if val in seq else 0 for seq in
                                                        (__class__.EVEN_NUM, __class__.ODD_NUM, __class__.UPPER_LETTERS,
                                                         __class__.LOWER_LETTERS,
                                                         )]):
        """进行字符串的排序
        :param: chars: 待排序的字符串
        :param: rules: 排序规则，需要是一个函数，函数返回值是一个列表，里边就是排序的优先级"""
        return "".join(sorted(chars, key=lambda x: rules(x)))


s = SolveStringUtils.gen_random_string(10)
print(s)
print(SolveStringUtils.sort_string(s))
